<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>P-Code</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/P-Code"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-P-Code rootpage-P-Code skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">P-Code</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>P-Code</b> ist der <a href="Befehlssatz" title="Befehlssatz">Befehlssatz</a> einer Pseudo-Maschine (oder P-Maschine), also einer virtuellen CPU, die P-Code als <a href="Maschinensprache" title="Maschinensprache">Maschinensprache</a> ausführt. Der P-Code war ein Computer- bzw. CPU-unabhängiger Code und war Teil der Entwicklungsumgebung <a href="UCSD_Pascal" title="UCSD Pascal">UCSD Pascal</a>. Die Umsetzung in die Maschinensprache der CPU erfolgt durch den Interpreter der P-Maschine. Man kann den P-Code und das Konzept der <a href="Virtuelle_Maschine" title="Virtuelle Maschine">virtuellen Maschine</a> als geistigen Vorläufer der heutigen <a href="Java_Virtual_Machine" title="Java Virtual Machine">Java Virtual Machine</a> betrachten.
</p>
<div class="mw-heading mw-heading2"><h2 id="Plattformen">Plattformen</h2></div>
<p>Durch die Unabhängigkeit von bestimmten Rechnerarchitekturen konnte das P-System auf verschiedenste Plattformen portiert werden:
</p>
<ul><li><a href="6502" class="mw-redirect" title="6502">6502</a> (<a href="Apple_II" title="Apple II">Apple II</a>, <a href="CBM-8000-Serie" title="CBM-8000-Serie">CBM-8000-Serie</a>, <a href="BBC_Micro" title="BBC Micro">BBC Micro</a>)</li>
<li><a href="Digital_Equipment_Corporation" title="Digital Equipment Corporation">DEC</a> LSI-11</li>
<li>DEC <a href="PDP-11" title="PDP-11">PDP-11</a></li>
<li><a href="Zilog_Z80" title="Zilog Z80">Zilog Z80</a> (<a href="CP/M" title="CP/M">CP/M</a>-Systeme)</li>
<li><a href="Motorola_68000" title="Motorola 68000">Motorola 68000</a></li>
<li><a href="Intel_8086" title="Intel 8086">Intel 8086</a> (<a href="IBM_PC" class="mw-redirect" title="IBM PC">IBM PC</a>)</li>
<li><a href="Texas_Instruments_TMS9900" title="Texas Instruments TMS9900">Texas Instruments TMS9900</a> (<a href="Texas_Instruments_TI-99/4" title="Texas Instruments TI-99/4">TI99</a>)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Funktionsumfang_der_P-Maschine">Funktionsumfang der P-Maschine</h2></div>
<ul><li>Adressierung von Variablen, Strings, <a href="Byte" title="Byte">Byte</a>-Arrays</li>
<li>Logische Verknüpfungen und Vergleiche</li>
<li><a href="Arithmetik" title="Arithmetik">Arithmetik</a> mit <a href="Konstante_(Programmierung)" title="Konstante (Programmierung)">Konstanten</a> und <a href="Variable_(Programmierung)" title="Variable (Programmierung)">Variablen</a> der Typen <a href="Integer_(Datentyp)" title="Integer (Datentyp)">Integer</a>, <a href="Datentyp#Datentypen_in_Programmiersprachen" title="Datentyp">Real</a>, <a href="Menge_(Datenstruktur)" title="Menge (Datenstruktur)">Set</a>, <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Array</a>, <a href="Zeichenkette" title="Zeichenkette">String</a></li>
<li>Verzweigungen, Sprünge</li>
<li><a href="Prozedur_(Programmierung)" title="Prozedur (Programmierung)">Prozedur</a>- und <a href="Funktion_(Programmierung)" title="Funktion (Programmierung)">Funktionsaufrufe</a></li>
<li><a href="Overlay_(Programmierung)" title="Overlay (Programmierung)">Overlay</a>-Prozeduren</li>
<li><a href="Systemaufruf" title="Systemaufruf">Systemfunktionen</a> und -prozeduren</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Register_des_Emulators">Register des Emulators</h2></div>
<p>Die P-Maschine ist eine <a href="16-Bit" class="mw-redirect" title="16-Bit">16-Bit</a>-Maschine; der <a href="Adressraum" title="Adressraum">Adressraum</a> ist damit auf 64 KiB beschränkt. Sie ist aber in der Lage, mehrere Adressräume zu verwalten, beispielsweise 128 KiB in Version IV. Zur <a href="Emulation" class="mw-redirect" title="Emulation">Emulation</a> des P-Codes dienen folgende <a href="Register_(Computer)" class="mw-redirect" title="Register (Computer)">Register</a> (<a href="Zeiger_(Informatik)" title="Zeiger (Informatik)">Pointer</a>):
</p>
<table class="wikitable">
<tbody><tr valign="top">
<td><b>SP</b>:</td>
<td><i>Stack-Pointer</i></td>
<td>Zeiger auf das oberste Wort im <a href="Stapelspeicher" title="Stapelspeicher">Stack</a>. Dient der Parameterübergabe und als Operandenquelle für den <a href="Interpreter" title="Interpreter">Interpreter</a>.
</td></tr>
<tr valign="top">
<td><b>IPC</b>:</td>
<td><i>Interpreter Program Counter</i></td>
<td>Adresse der nächsten P-Code-<a href="Instruktion" title="Instruktion">Instruktion</a> im <a href="Codesegment" title="Codesegment">Codesegment</a> der aktuellen Prozedur
</td></tr>
<tr valign="top">
<td><b>SEG</b>:</td>
<td><i>Segment Pointer</i></td>
<td>Zeiger auf das Prozedurverzeichnis des aktuellen Segments
</td></tr>
<tr valign="top">
<td><b>JTAB</b>:</td>
<td><i>Jump Table Pointer</i></td>
<td>Zeiger auf die Sprungtabelle des aktuellen Segments
</td></tr>
<tr valign="top">
<td><b>KP</b>:</td>
<td><i>Program Stack Pointer</i></td>
<td>Zeiger auf das Ende des <a href="Computerprogramm" title="Computerprogramm">Programm</a>-Stacks
</td></tr>
<tr valign="top">
<td><b>MP</b>:</td>
<td><i>Markstack Pointer</i></td>
<td>Zeiger auf den Aktivierungs-Record der aktuellen Prozedur zum Zugriff auf die lokalen Variablen
</td></tr>
<tr valign="top">
<td><b>NP</b>:</td>
<td><i>New Pointer</i></td>
<td>Zeiger auf das Ende des dynamischen Heaps
</td></tr>
<tr valign="top">
<td><b>BASE</b>:</td>
<td><i>Base Procedure</i></td>
<td>Zeiger auf den Aktivierungs-Record der Basis-Prozedur zum Zugriff auf die globalen Variablen
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="P-Code_(Befehlssatz_der_P-Maschine)"><span id="P-Code_.28Befehlssatz_der_P-Maschine.29"></span>P-Code (Befehlssatz der P-Maschine)</h2></div>
<p>Der Befehlscode der Pseudo-Maschine ist ein oder zwei Byte lang und wird von bis zu vier <a href="Operand" class="mw-disambig" title="Operand">Operanden</a> gefolgt. Es gibt folgende Befehlsklassen:
</p>
<ul><li>1-Wort-Transportbefehle</li>
<li>Mehr-Wort-Transportbefehle</li>
<li>Byte-Array-Behandlung</li>
<li>String-Behandlung</li>
<li>Record und Array-Behandlung</li>
<li>Dynamische Speicherallokation</li>
<li>Arithmetik-Befehle</li>
<li>Sprungbefehle</li>
<li>Prozedur- und Funktionsaufrufe</li>
<li>Unterstützungs-Routinen</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Verbindung_zwischen_P-Maschine_und_Betriebssystem">Verbindung zwischen P-Maschine und Betriebssystem</h2></div>
<p>Das <a href="UCSD_Pascal" title="UCSD Pascal">UCSD-Pascal</a>-<a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a> und die virtuelle P-Maschine tauschen Informationen über die Systemvariable <b>SYSCOM</b> aus. Diese befindet sich im äußeren <a href="Datenblock" title="Datenblock">Block</a> des Betriebssystems. Dieser Speicherbereich ist der P-Maschine „bekannt“.
</p>
<div class="mw-heading mw-heading2"><h2 id="P-Code-Beispiel">P-Code-Beispiel</h2></div>
<p>Auszug aus einem Disassembler-Listing:
</p>
<pre>Attribute Table
-------------------------
Procedure No.: 37
Lex Level: 0
EnterIC: 54
Exit IC: 7
Parameter Size: 0 words
Data Size: 2 words
-------------------------
Block No:|58
Block Offset:|132
Offset P-Code Hex-Code
0 CBP 36 C224
2 LOD 1 1 B60101
5 SRO 1 AB01
7 SLDO1 E4
8 INC 31 A21F
10 SRO 2 AB02
12 SLDC3 03
13 CSP UNITCLEA 9E26
15 SLDO2 E9
16 INC 1 A201
18 SLDC8 08
19 SLDC0 00
20 LDP BA
21 SLDC0 00
22 NEQI CB
23 FJP 36 A10B
25 SLDC3 03
26 SLDO2 E9
27 INC 1 A201
29 SLDC8 08
30 SLDC0 00
31 LDP BA
32 CBP 52 C234
34 UJP 45 B909
36 SLDC6 06
37 SLDD02 E9
38 INC 4 A204
40 SLDC8 08
41 SLDC8 08
42 LDP BA
43 CBP 52 C234
45 RBP 0 C100
</pre>
<p>In UCSD-Pascal sieht die Prozedur so aus:
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span></span><span class="k">PROCEDURE</span><span class="w"> </span><span class="nf">CLEARSCREEN</span><span class="o">;</span><span class="w"> </span><span class="cm">(*Bemerkung*)</span>
<span class="w"> </span><span class="k">BEGIN</span><span class="w"> </span><span class="n">HOMECURSOR</span><span class="o">;</span><span class="w"> </span><span class="cm">(*Offset 0*)</span>
<span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="n">SYSCOM</span><span class="o">^,</span><span class="n">CRTCTRL</span><span class="w"> </span><span class="k">DO</span><span class="w"> </span><span class="cm">(*Offset 10*)</span>
<span class="w"> </span><span class="k">BEGIN</span>
<span class="w"> </span><span class="n">UNITCLEAR</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="o">;</span><span class="w"> </span><span class="cm">(*Offset 13*)</span>
<span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="n">ERASEEOS</span><span class="w"> </span><span class="o"><></span><span class="w"> </span><span class="nb">CHR</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">THEN</span><span class="w"> </span><span class="cm">(*Offset 23*)</span>
<span class="w"> </span><span class="n">PUTPREFIXED</span><span class="p">(</span><span class="mi">3</span><span class="o">,</span><span class="n">ERASEEOS</span><span class="p">)</span><span class="w"> </span><span class="cm">(*Offset 32*)</span>
<span class="w"> </span><span class="k">ELSE</span><span class="w"> </span><span class="cm">(*Offset 34*)</span>
<span class="w"> </span><span class="n">PUTPREFIXED</span><span class="p">(</span><span class="mi">6</span><span class="o">,</span><span class="n">CLEARSCREEN</span><span class="p">)</span><span class="w"> </span><span class="cm">(*Offset 43*)</span>
<span class="w"> </span><span class="k">END</span>
<span class="k">END</span><span class="w"> </span><span class="cm">(*CLEARSCREEN*)</span><span class="w"> </span><span class="o">;</span><span class="w"> </span><span class="cm">(*Offset 45*)</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Apple_Pascal" title="Apple Pascal">Apple Pascal</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.sageandstride.org/html/manuals.html">Handbücher</a></li>
<li><a rel="nofollow" class="external text" href="http://klebsch.de">Implementierung in C</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-08-16" href="https://de.wikipedia.org/wiki/?title=P-Code&oldid=247745746">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>